package com.yl.applicationsecurity.utils;

import java.util.Calendar;
import java.util.Date;

/**
 * @author 鹤仙问鹿仙
 * @program: Application-security
 * @description: 时间工具类
 * @date 2025-04-30 15:14:47
 */
public class DateUtils {

    /**
     * 获取传入时间所在月份的最后一个时间点（精确到秒）
     *
     * @param date 传入的任意时间（Date 类型）
     * @return 当月最后一天的 23:59:59 的 Date 对象
     */
    public static Date getLastMomentOfMonth(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("输入时间不能为空");
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        // 设置到下月的第 1 天，00:00:00
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);

        // 回退一秒，得到当前月最后一秒
        calendar.add(Calendar.SECOND, -1);

        return calendar.getTime();
    }


    /**
     * 获取传入时间所在月份的第一天（时间设为00:00:00）
     *
     * @param date 任意一个时间
     * @return 该月第一天的时间点（00:00:00）
     */
    public static Date getFirstDayOfMonth(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("输入时间不能为空");
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);

        calendar.set(Calendar.DAY_OF_MONTH, 1);       // 设置为月第一天
        calendar.set(Calendar.HOUR_OF_DAY, 0);         // 设置小时为 0
        calendar.set(Calendar.MINUTE, 0);              // 设置分钟为 0
        calendar.set(Calendar.SECOND, 0);              // 设置秒为 0
        calendar.set(Calendar.MILLISECOND, 0);         // 设置毫秒为 0

        return calendar.getTime();
    }

    /**
     * 获取传入时间是该月的第几天
     * @param date 任意一个时间
     * @return 第几天（1~31）
     */
    public static int getDayOfMonth(Date date) {
        if (date == null) {
            throw new IllegalArgumentException("输入时间不能为空");
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.DAY_OF_MONTH);
    }


    /**
     * 根据传入时间判断：
     * - 如果是过去的月份，返回该月的总天数；
     * - 如果是当前月份，返回当前已过的天数（含当天）；
     * - 如果是未来月份，返回 0。
     *
     * @param inputDate 传入时间
     * @return 天数
     */
    public static int getElapsedOrTotalDays(Date inputDate) {
        if (inputDate == null) {
            throw new IllegalArgumentException("输入时间不能为空");
        }

        Calendar inputCal = Calendar.getInstance();
        inputCal.setTime(inputDate);

        Calendar nowCal = Calendar.getInstance();

        int inputYear = inputCal.get(Calendar.YEAR);
        int inputMonth = inputCal.get(Calendar.MONTH); // 0-based
        int nowYear = nowCal.get(Calendar.YEAR);
        int nowMonth = nowCal.get(Calendar.MONTH);

        // 比当前月份早：返回该月总天数
        if (inputYear < nowYear || (inputYear == nowYear && inputMonth < nowMonth)) {
            return inputCal.getActualMaximum(Calendar.DAY_OF_MONTH);
        }

        // 是当前月份：返回当天是第几天（含当天）
        if (inputYear == nowYear && inputMonth == nowMonth) {
            return nowCal.get(Calendar.DAY_OF_MONTH);
        }

        // 是未来月份：返回 0
        return 0;
    }

    /**
     * 获取指定日期加上指定天数后的时间
     *
     * @param date  输入日期
     * @param days  增加的天数
     * @return 计算后的日期
     */
    public static Date addDays(Date date, int days) {
        if (date == null) {
            throw new IllegalArgumentException("输入日期不能为空");
        }

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, days); // 增加指定天数
        return calendar.getTime();
    }


    public static void main(String[] args) {
        Integer i = DateUtils.getElapsedOrTotalDays(new Date());
        System.out.println(i);
    }

}

